﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;
using System.Reflection;

namespace Pittypat
{
    /// <summary>
    /// 表示一个参数的元数据信息。
    /// </summary>
    public sealed class ParameterMeta
    {
        /// <summary>
        /// 使用 <see cref="ParameterAttribute"/> 和反射信息创建 <see cref="ParameterMeta"/> 的新实例。
        /// </summary>
        /// <param name="attr">一个 <see cref="ParameterAttribute"/> 对象实例。</param>
        /// <param name="prop">一个 PropertyInfo 对象实例。</param>
        internal ParameterMeta(ParameterAttribute attr, PropertyInfo prop)
        {
            this.Identifier = prop.Name;
            this.DataType = prop.PropertyType;
            this.Position = attr.Position;
            this.Direction = attr.Direction;
            this.Role = attr.Role;
            this.MaxLength = attr.MaxLength;
            this.FixedLength = attr.FixedLength;
            this.Ascii = attr.Ascii;
            this.CamelIdentifier = this.Identifier.Camel();
            this.IsPrimitive = typeof(IPrimitive).IsAssignableFrom(this.DataType) || (this.DataType.IsGenericType && this.DataType.GetGenericTypeDefinition() == typeof(Nullable<>));
        }

        /// <summary>
        /// 获取一个值，该值指示参数类型是否基础类型，也就是实现了 <see cref="IPrimitive"/> 的类型，或者实现了 <see cref="IPrimitive"/> 的可空类型。
        /// </summary>
        public bool IsPrimitive { get; private set; }

        /// <summary>
        /// 获取参数标识符的 camel 格式。
        /// </summary>
        public string CamelIdentifier { get; private set; }

        /// <summary>
        /// 获取参数的标识符。
        /// </summary>
        public string Identifier { get; private set; }

        /// <summary>
        /// 获取参数的数据类型。
        /// </summary>
        public Type DataType { get; private set; }

        /// <summary>
        /// 获取参数在参数列表中的位置，从 0 开始。
        /// </summary>
        public int Position { get; private set; }

        /// <summary>
        /// 获取参数的方向，默认为 In。
        /// </summary>
        public ParameterDirection Direction { get; private set; }

        /// <summary>
        /// 获取参数的作用。默认为 Normal。
        /// </summary>
        public ParameterRole Role { get; private set; }

        /// <summary>
        /// 获取字符串或二进制流参数的最大长度，或者十进制数字的小数位数。默认为 0。
        /// </summary>
        public int MaxLength { get; private set; }
        
        /// <summary>
        /// 获取一个值，该值指示字符串或二进制流的长度是固定值。默认为 false。
        /// </summary>
        public bool FixedLength { get; private set; }

        /// <summary>
        /// 获取一个值，该值指示字符串是否仅仅包含 ASCII 字符。默认为 false。
        /// </summary>
        public bool Ascii { get; private set; }
    }
}
